#ifndef ASFINGER_PBRPC_CORE_AFPB_SERVICE_GENERATOR_H_
#define ASFINGER_PBRPC_CORE_AFPB_SERVICE_GENERATOR_H_

#include <cstdint>

#include <map>
#include <string>

#include <google/protobuf/stubs/common.h>

#include "afpb_fwd.h"

namespace pb    = ::google::protobuf;
namespace pbcpp = pb::compiler::cpp;

/*!
 * asfinger protobuf base 服务发生器
 */
class AfpbServiceGenerator {
 public:
  AfpbServiceGenerator(const pb::ServiceDescriptor *descriptor,
                       const pbcpp::Options &options);
  ~AfpbServiceGenerator();

  /*!< 头文件 服务类接口和存根实现的类定义 */
  void GenerateDeclarations(pb::io::Printer *printer);

  /*!< 实现所有由GenerateDeclarations()声明的实现 */
  void GenerateImplementation(pb::io::Printer *printer);

  /*!< 源文件 生成用于存储初始化服务的全局变量 */
  void GenerateDescriptorInitializer(pb::io::Printer *printer, int index);

 private:
  /*!< 头文件 服务抽象接口 */
  void GenerateInterface(pb::io::Printer *printer);

  /*!< 所有客户端方法签名 */
  void GenerateClientMethodSignatures(pb::io::Printer *printer);
  /*!< 所有服务端方法签名 */
  void GenerateServerMethodSignatures(pb::io::Printer *printer);

  /*!< 源文件 方法实现 */
  void GenerateClientMethodImplementations(pb::io::Printer *printer);

  /*!< 服务端CallMethod() 方法 */
  void GenerateServerCallMethod(pb::io::Printer *printer);
  /*!< 服务端实现 */
  void GenerateServerImplementations(pb::io::Printer *printer);

  /*!< 服务名称hash算法 */
  std::uint32_t HashServiceName(std::string const &name);

 private:
  const pb::ServiceDescriptor *descriptor_ { nullptr }; /*!< 服务描述句柄 */
  std::map<std::string, std::string> vars_; /*!< 服务需要的参数 */

  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(AfpbServiceGenerator);
};

#endif // ASFINGER_PBRPC_CORE_AFPB_SERVICE_GENERATOR_H_